package com.yupi.springbootinit.service;

import com.yupi.springbootinit.model.dto.processbatch.ProcessBatchScheduleUpdateRequest;
import com.yupi.springbootinit.model.dto.processbatch.ProcessBatchStepDurationDTO;
import com.yupi.springbootinit.model.dto.processbatch.ProcessBatchUpdateRequest;
import com.yupi.springbootinit.model.entity.BatchScheduleHistory;
import com.yupi.springbootinit.model.entity.ProcessBatch;
import com.yupi.springbootinit.model.entity.ProcessBatchStep;
import com.yupi.springbootinit.model.vo.PMCTaskDetailVO;
import com.yupi.springbootinit.model.vo.pmc.PmcGroupedBatchesVO;
import com.yupi.springbootinit.model.vo.pmc.ProcessBatchDetailVO;
import com.yupi.springbootinit.model.vo.pmc.ProcessBatchProgressVO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface ProcessBatchService {

    List<ProcessBatch> generateBatches(Long processSheetId, Integer total, List<String> batchCodes,
                                       String batchCodePrefix, List<Integer> batchQuantities,
                                       Integer defaultQuantityPerBatch, Long userId, String userName);

    ProcessBatch autoSchedule(Long batchId, LocalDateTime planStart, Long userId, String userName);

    ProcessBatch autoSchedule(Long batchId, LocalDateTime planStart, List<ProcessBatchStepDurationDTO> stepDurations, Long userId, String userName);

    boolean updateStepDurations(Long batchId, List<ProcessBatchStepDurationDTO> overrides, Long userId, String userName);

    boolean updateBatchBase(Long batchId, ProcessBatchUpdateRequest req, Long userId, String userName);

    boolean updateSchedule(Long batchId, ProcessBatchScheduleUpdateRequest req, Long userId, String userName);

    boolean submit(Long batchId, Long userId, String userName);

    boolean deleteBatch(Long batchId, String reason, Long userId, String userName);

    /**
     * 按订单号+产品聚合返回批次信息
     */
    List<PmcGroupedBatchesVO> listBatchesGrouped(Long processSheetId, String orderNumber, String productName, String status);

    ProcessBatch getById(Long id);

    List<ProcessBatchStep> listSteps(Long batchId);

    // 排程变更历史查询
    List<BatchScheduleHistory> listScheduleHistory(Long batchId);

    /**
     * 获取PMC任务详情（包含订单信息和工艺单信息）
     *
     * @param taskId 任务ID
     * @param userId 当前用户ID
     * @return PMC任务详情
     */
    PMCTaskDetailVO getPmcTaskDetail(Long taskId, Long userId);

    /**
     * 标记工序开始：写入 actual_start（仅首次），并将状态置为 IN_PROGRESS（如存在）
     */
    boolean markStepStarted(Long batchId, Long stepId);

    /**
     * 标记工序完成：写入 actual_end（仅首次），并将状态置为 COMPLETED（如存在）
     */
    boolean markStepCompleted(Long batchId, Long stepId);
    /**
     * 获取批次详细进度（包含质检状态）
     */
    ProcessBatchProgressVO getBatchProgress(Long batchId);

    /**
     *检查并更新批次状态为 COMPLETED（如果所有工序都已完成）
     *
     * @param batchId 批次ID
     * @return true-状态已更新为COMPLETED, false-仍有未完成工序
     */
    boolean updateBatchStatusIfCompleted(Long batchId);

    /**
     *检查工艺单的所有批次是否都已完成
     *
     * @param processSheetId 工艺单ID
     * @return true-所有批次都已完成, false-仍有未完成批次
     */
    boolean isAllBatchesCompleted(Long processSheetId);

    /**
     * PMC批次排期（设置计划时间并自动计算工序时间）
     */
    ProcessBatch scheduleBatch(Long batchId, LocalDateTime planStart, List<ProcessBatchStepDurationDTO> stepDurations, Long userId, String userName);

    /**
     * 获取批次列表（支持通过任务ID筛选）
     *
     * @param taskId 任务ID（可选）
     * @param processSheetId 工艺单ID
     * @param orderNumber 订单号
     * @param productName 产品名称
     * @param status 状态
     * @return 批次列表
     */
    List<ProcessBatch> listBatches(Long taskId, Long processSheetId, String orderNumber, String productName, String status);


    ProcessBatchDetailVO getBatchDetail(Long id);

    // 在 ProcessBatchService 接口中新增：

    /**
     * 根据流程卡号查询批次信息（用于打印机台记录自动填充）
     *
     * @param flowNumber 流程卡号
     * @return 包含产品列表和材料信息的Map
     */
    Map<String, Object> getByFlowNumber(String flowNumber);
}